/**
 * Created by cql-cql-cql on 2017/6/6 0006.
 */
const tookit = require('../common/index')
const createToken = tookit.createToken
const verifyToken = tookit.verifyToken
const UserModel = require('../model/user')


/**
 * 权限验证中间件
 * @return 成功时next()，失败时返回失败信息
 */
async function permission(ctx, next) {
    try {
        // 通过authorization请求头获取token
        let token = (ctx.request.headers)['authorization'];
        // 如果token不存在
        if (!token) {
            return ctx.body = { status: 'fail', data: 'token no found' };
        }

        // 获取验证token后的数据
        let result = verifyToken(token);
        // token验证失败
        if (result == false) {
            // 响应401和token过期
            ctx.status = 401;
            return ctx.body = { status: 'fail', data: { msg : 'token过期' } };
        }
        // 验证数据库的token已经删除(已经登出)
        if ((await UserModel.findOne({ token: token })) == null) {
            // 响应403和token失效(已经登出)
            ctx.status = 403;
            return ctx.body = { status: 'fail', data: 'token已失效' };
        }

        // 创建新的token
        let newToken = createToken({ code: result.code});
        // 设置响应头Authorization值为新的token
        ctx.set('Authorization', newToken);
        // 将新的token写进数据库
        await UserModel.updateOne({code: result.code}, {$set: {token: newToken}})
        return next();
    } catch (e) {
        return ctx.body = { status: 'fail', data: e.message, }
    }
}


